#ifndef MELSECCOMM_H
#define MELSECCOMM_H

#include <QObject>
#include <QTcpSocket>
#include <QQueue>
#include <QThread>
#include "melsec_3e.h"

struct PositionCorrect
{
    double x[2];
    double y[2];
    double theta[2];
};

#define LEFT_ROBOT 0
#define RIGHT_ROBOT 1

/**
 * @brief The MelsecComm class 和PLC控制器通讯的类。
 */
class PlcComm : public QThread
{
    Q_OBJECT
public:
    explicit PlcComm(QObject *parent = nullptr);
    ~PlcComm();
    bool connectToRobot(QString ip, int port);
    /**
     * @brief setData 设置 Panel 位置补偿数据。
     * @param x
     * @param y
     * @param theta
     * @param N  有几个 Panel 数据。最多只能是 2 。1 的话表示只有左边有 Panel。
     * @return true 表示设置成功，false 表示失败，通常失败是因为 Robot 还没取走前次数据。
     */
    bool setData(int robot, double x[2], double y[2], double theta[2], int N);

    void SetGrabImageSuccess(int robot);
    void SetMatchModelFaild(int robot);
signals:
    void plcConnected();
    void plcDisconnected();
    void plcDataUpload(int robot);
    void trigger(int robotNo, QString recipe, QString leftPanelID, QString rightPanelID); //0 表示LEFT ROBOT，1表示 RIGHT ROBOT
    void offsetDisable(int robotNo);
private slots:
    void onConnected();
    void onDisconnected();
    void setDisconnected();
    void displayError(QAbstractSocket::SocketError socketError);
protected:
    void run() override;

private:
    void reConnect();
    void handleOffset();
    void handleTriggerImage();
    void updateRobotData(int robot);
    void updateGrabImageResult();
    void updateMatchModelResult();
private:
    QString m_ip;
    int m_port;
    QTcpSocket *m_socket;
    QQueue<PositionCorrect> m_data[2];
    QString m_cmdBuffer;
    volatile bool m_stopped;
    volatile bool m_connected;
    volatile bool m_grabImage[2];
    volatile bool m_matchModel[2];
    int m_loopCnt;
//public:
   // QVariant sockettimeout=1000;
};

#endif // MELSECCOMM_H
